package com.switz.agendacita.services;

import com.switz.agendacita.dto.Empresa;
import com.switz.agendacita.dto.EmpresaPersonal;
import com.switz.agendacita.dto.EmpresaServicio;
import com.switz.agendacita.dto.Usuario;
import com.switz.agendacita.persistence.iface.*;
import com.switz.agendacita.services.iface.EmpresaService;
import com.switz.agendacita.utils.Constantes;
import com.switz.agendacita.utils.EncryptAES;
import com.switz.agendacita.utils.mail.MailMail;
import com.switz.agendacita.vo.Login;
import com.switz.agendacita.vo.ReservacionPendiente;
import com.switz.agendacita.vo.ReservacionSeleccionada;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class EmpresaServiceImpl implements EmpresaService {

    @Autowired
    @Qualifier("empresaDaoImpl")
    private EmpresaDao empresaDao;
    @Autowired
    @Qualifier("empresaServicioDaoImpl")
    private EmpresaServicioDao empresaServicioDao;
    @Autowired
    @Qualifier("tipoEmpresaDaoImpl")
    private TipoEmpresaDao tipoEmpresaDao;
    @Autowired
    @Qualifier("personalServicioDaoImpl")
    private PersonalServicioDao personalServicioDao;
    @Autowired
    private MailMail mailMail;

    @Override
    public List listarEmpresas() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List listarServiciosPorEmpresa(String idEmpresa) {
        return empresaDao.getServiciosPorEmpresa(idEmpresa);
    }

    @Override
    public void registrarEmpresa(Empresa empresa) {
        try {
            EncryptAES aES = new EncryptAES();
            String idEncriptado = aES.encrypt(empresa.getId());
            //System.out.println("id empresa encriptado "+idEncriptado);
            String idEncodificadoEIncriptado = URLEncoder.encode(idEncriptado);
            //System.out.println("id empresa encodificado "+idEncodificadoEIncriptado);
            //enviamos correo de confirmar usuario 
            mailMail.sendMail(empresa.getMail(), "confirmar empresa",
                    new String().format(Constantes.CONFIRMAR_EMPRESA, idEncodificadoEIncriptado));
            empresaDao.insertEmpresa(empresa);
        } catch (Exception ex) {
            Logger.getLogger(EmpresaServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @Override
    public void actualizarEmpresa(Empresa empresa) {
        empresaDao.updateEmpresa(empresa);

    }

    @Override
    public List listarTiposEmpresas() {

        return tipoEmpresaDao.getTiposEmpresa();
    }

    @Override
    public List listarTiposPorEmpresa(String idEmpresa) {
        return empresaDao.getEmprasaTipos(idEmpresa);
    }

    @Override
    public List listarCatalogoServiciosPorEmpresa(String[] tiposEmpresa) {
        return empresaDao.getCatalogoServiciosPorEmpresa(tiposEmpresa);
    }

    @Override
    public List listarReservacionesPendientesPorEmpresa(String idEmpresa) {
        List<ReservacionPendiente> reservacionPendiente = new ArrayList<>();
        reservacionPendiente = empresaDao.getReservacionesPendientesPorEmpresa(idEmpresa);
        return reservacionPendiente;
    }

    @Override
    public ReservacionSeleccionada obtenerDatosReservacionSeleccionada(String idReservacion) {
        return empresaDao.getReservacionSeleccionada(idReservacion);
    }

    @Override
    public Empresa obtenerEmpresa(String mail, String psw) {
        return empresaDao.getEmpresa(mail, psw);
    }

    @Override
    public Usuario obtenerUsuario(String mail, String psw, int tipoUsuario) {
        return empresaDao.getUsuario(mail, psw, tipoUsuario);
    }

    public Login getLogin(String mail, String psw) {
        Login l = new Login();
        Empresa empresa = empresaDao.getEmpresa(mail, psw);
        Usuario usuarioPersonal = empresaDao.getUsuario(mail, psw, 2);
        if (empresa != null) {
            l.setIdEmpresa(empresa.getId());
            l.setNombreEmpresa(empresa.getNombre());
            return l;
        } else if (usuarioPersonal != null) {
            l.setIdPersonal(usuarioPersonal.getId());
            l.setNombrePersonal(usuarioPersonal.getNombre());
            return l;
        } else {
            return null;
        }
    }

    @Override
    public void agregarEmpresaPersonal(EmpresaPersonal empresaPersonal) {
        empresaDao.insertEmpresaPersonal(empresaPersonal);

    }

    @Override
    public List listarCatalogoSugerenciasServiciosPorEmpresa(String idEmpresa) {
        return empresaDao.getCatalogoSugerenciasServiciosPorEmpresa(idEmpresa);
    }

    @Override
    public void eliminarEmpresaServicioTXT(String idEmpresa, String idServicio) {
        personalServicioDao.deletePersonalServicio(idEmpresa, idServicio);
        empresaServicioDao.deleteEmpresaServicio(idEmpresa, idServicio);

    }

    @Override
    public List listarPersonalPorEmpresa(String idEmpresa) {
        return empresaDao.getPersonalPorEmpresa(idEmpresa);
    }

    @Override
    public void registrarEmpresaServicio(EmpresaServicio empresaServicio) {
        empresaServicioDao.insertEmpresaServicio(empresaServicio);
    }

    @Override
    public boolean actualizarPsw(String idEmpresa, String psw, String pswNuevo) {
        Empresa empresa;
        empresa = empresaDao.getPsw(idEmpresa);
        if (psw.equals(empresa.getPsw())) {
            empresaDao.updatePswEmpresa(pswNuevo, idEmpresa);
            return true;
        } else {
            return false;
        }
    }

    @Override
    public EmpresaServicio obtenerCostoTiempoDelServicio(String idEmpresa,
            String idServicio) {
        return empresaServicioDao.getCostoTiempoServicioEmpresa(idEmpresa, idServicio);
    }

    @Override
    public void actualizarCostoTiempoDelServicio(String idEmpresa,
            String idServicio, Float costo, Integer tiempo) {
        empresaServicioDao.updateCostoServicioEmpresa(idEmpresa, idServicio, costo, tiempo);

    }

    @Override
    public Empresa obtenerEmpresaPorMail(String mail) {

        Empresa empresa = empresaDao.getEmpresaPorMail(mail);
        return empresa;
    }

    @Override
    public void actualizarStatusEmpresa(String id) {
       empresaDao.updateStatusEmpresa(id);
    }

    @Override
    public Empresa obtenerEmpresa(String id) {
      return empresaDao.getEmpresa(id);
    }
}
